package student.aistar.day14;

import java.util.ArrayList;
import java.util.List;

/**
 * 泛型只有编译期间的概念, 在运行期间将会被擦除
 */
public class GenericRuntimeDemo {
    public static void main(String[] args) {
        //多态的语法 - 多态的应用
        //面向父类编程 / 面向接口编程
        //编译时类型 对象名 = new 运行时类型();
        //父类    对象 = new 运行时类型();
        //接口    对象 = new 实现类();

        //java.lang.Integer extends java.lang.Number
        //java.lang.Long extends java.lang.Number

        Number n1 = new Integer(10);
        Number n2 = new Long(20L);
        //jdk5.0~jdk7.0之前
        List<Integer> list01 = new ArrayList<Integer>();
//        List<Number> list03 = new ArrayList<Integer>();
        //思考 - 为什么上条语句编译是错误的
        //结论: 泛型是没有多态的
        //原因: 泛型只有编译期间的概念, 运行期间会消除
        List<Integer> list02 = new ArrayList<Integer>();

        //获取对象的运行时类型

        List<Integer> list1 = new ArrayList<>();
        List<Long> list2 = new ArrayList<>();

        Class<?> c1 = list1.getClass();
        Class<?> c2 = list2.getClass();
        System.out.println(c1 == c2);//true;
        //结论: 获取运行时类型始终都是ArrayList, 和<Integer> 和 <Long> 是无关的
        //所以泛型仅仅是在编译期间有效, 但是在运行期间是无效的
        System.out.println(c1);//class java.util.ArrayList
        System.out.println(c2);//class java.util.ArrayList

        //结论: 一个类无论被实例化多少次, 他在JVM中的Class对象 / 实例永远只有一个
        //        User user1 = new User();
//        System.out.println(user1.getClass());//class tech.aistar.day05.User
//
//        User user2 = new User();
//        System.out.println(user2.getClass());//class tech.aistar.day05.User
//
//        System.out.println(user1.getClass() == user2.getClass());//true

    }
}
